package com.fowo.api.common.util;

import lombok.experimental.UtilityClass;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 提供日期时间相关辅助方法
 * @author yl_ls
 */
@SuppressWarnings("unused")
@UtilityClass
public class DateUtils {
    public static final String PATTERN_DATE_TIME = "yyyy-MM-dd HH:mm:ss";
    public static final String PATTERN_DATE = "yyyy-MM-dd";
    public static final String PATTERN_TIME = "HH:mm:ss";

    /**
     * 获取指定的时间表示的 "2022H1" 格式
     * @param date 时间，为空时默认为当前时间
     */
    public String yearAndHalf(@Nullable Date date) {
        final Calendar instance = getCalendar(date);
        int year = instance.get(Calendar.YEAR);
        int month = instance.get(Calendar.MONTH);
        return String.format("%dH%d", year, month > 6 ? 1 : 2);
    }

    /**
     * 获取指定时间表示的 "2022Q3" 格式
     * @param date 时间，为空时默认为当前时间
     */
    public String yearAndQuarter(@Nullable Date date) {
        final Calendar instance = getCalendar(date);
        int year = instance.get(Calendar.YEAR);
        int month = instance.get(Calendar.MONTH);
        return String.format("%dQ%d", year, monthToQuarter(month));
    }

    /**
     * 获取指定时间的格式化样式
     * @param date 时间，为空时默认为当前时间
     * @param pattern 格式化模式
     */
    public String toString(@Nullable Date date, String pattern) {
        if (date == null) {
            date = new Date();
        }
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        return sdf.format(date);
    }

    /**
     * 获取指定日期的格式化样式
     * @param date 时间，为空时默认为当前时间
     */
    public String toDateString(@Nullable Date date) {
        if (date == null) {
            return null;
        }
        return toString(date, PATTERN_DATE);
    }

    /**
     * 获取月份表示的季度
     * @param month 月份，从 0 开始
     */
    private int monthToQuarter(int month) {
        if (month < 3) {
            return 1;
        }
        else if (month < 6) {
            return 2;
        }
        else if (month < 9) {
            return 3;
        }
        return 4;
    }

    @NotNull
    private Calendar getCalendar(Date date) {
        final Calendar instance = Calendar.getInstance();
        if (date != null) {
            instance.setTime(date);
        }
        return instance;
    }

    /**
     * 计算日期加上指定天数后的日期
     * @param date 日期
     * @param days 天数
     * @return 日期
     */
    public Date addDays(Date date, int days) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.DATE, days);
        return calendar.getTime();
    }
}
